package dao;

import java.io.Serializable;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.util.List;

import modelo.Domicilio;
import modelo.Estadousuario;
import modelo.Interesado;
import modelo.Perfil;
import modelo.Persona;
import modelo.Propietario;
import modelo.Telefonopersona;
import modelo.Usuario;

import org.hibernate.Criteria;
import org.hibernate.FetchMode;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.criterion.Restrictions;

import util.HibernateUtil;

public class InteresadoDao implements Serializable {
	
	private static final long serialVersionUID = -4278406182834578172L;
	
	private Session session;
	SessionFactory sessionFactory = HibernateUtil.getSessionFactory();

	public InteresadoDao() {
		super();
	}
	
	public List<Interesado> obtenerInteresado() {
		session=sessionFactory.openSession();
		
		Query query = session.createQuery("SELECT i FROM Interesado i");
		List<Interesado> i = query.list();
		
		session.close();
		
		return i;
	}
	
	public List<Interesado> obtenerInteresadoFiltrado() {
		
		session=sessionFactory.openSession();
		Criteria crit = session.createCriteria(Propietario.class)
				.createAlias("persona", "persona")
				.setFetchMode("persona", FetchMode.JOIN)
				.createAlias("persona.usuarios", "usuario")
				.setFetchMode("usuario", FetchMode.JOIN)
				.createAlias("usuario.estadousuario", "estado")
				.setFetchMode("estado", FetchMode.JOIN)
				//
		        //.createAlias("persona.usuarios", "usuario")
		        //.createAlias("usuarios.estadousuario", "estado")
		        .add(Restrictions.eq("estado.idEstadoUsuario", 1));
		 
		List<Interesado> i= crit.list();
		
		session.close();
		return i;
	}

	/*public void activarInteresado(Interesado i,) throws Exception
	{
		Transaction transaction = null;
		EstadoUsuario estado = new EstadoUsuario();
		Usuario usuario = new Usuario();
		estado.setIdEstadoUsuario(2);
		
		try{
			
			session = sessionFactory.openSession();
	        transaction=session.beginTransaction();	
	        
	        usuario=p.getPersona().getUsuarios();
	        usuario.setEstadousuario(estado);
		    p.setTiposuscripcion(ts);
		    session.update(usuario);
	        session.update(p);
	        
	        transaction.commit();
	        
	       } catch (Exception e2) {
	            //Error
	            if (transaction != null) {
	                transaction.rollback();
	                throw e2;
	              }
	        } finally { 
	            session.close();
	        }
	}
	*/
	public void guardarInteresado(Usuario u, Persona p, Domicilio d, List<Telefonopersona> listTel) throws Exception {
		
		Interesado interesado = new Interesado();
		Estadousuario estado = new Estadousuario(); 
		Perfil perfil = new Perfil(); 
		estado.setIdEstadoUsuario(2);
		perfil.setIdPerfil(3);
		
		Transaction transaction = null;

		MessageDigest md = null;
		String password = u.getContrasenia();
		try{
			
		session = sessionFactory.openSession();
        transaction=session.beginTransaction();	
        
		// encripta la password
        md= MessageDigest.getInstance("MD5");
        md.update(password.getBytes());
        byte[] digest = md.digest();
		StringBuffer sb = new StringBuffer();
		for (byte b : digest) {
			sb.append(String.format("%02x", b & 0xff));
		}
        u.setContrasenia(sb.toString());        
        
        // Registra Persona
        session.save(p);
        
        // Recupera el last_id de Persona
        Long lastId = ((BigInteger) session.createSQLQuery(
				"SELECT LAST_INSERT_ID()").uniqueResult()).longValue();

		int anInt = new BigDecimal(lastId).intValueExact();
		
		
		
		//Asigna el idPersona
		p.setIdPersona(anInt);
		interesado.setPersona(p);
		u.setPersona(p);
			
		
		// Registra Domicilio
		session.save(d);
		
		//Registra el usuario
		u.setEstadousuario(estado);
		u.setPerfil(perfil);
		session.save(u);
		
		// Recupera el last_id de Domicilio
		lastId = ((BigInteger) session.createSQLQuery(
				"SELECT LAST_INSERT_ID()").uniqueResult()).longValue();
		anInt = new BigDecimal(lastId).intValueExact();
		
		//Asigna el idDomicilio
		d.setIdDomicilio(anInt);
		p.setDomicilio(d);
		session.save(p);		
		
		/*// Recupera el last_id de Empresa
		lastId = ((BigInteger) session.createSQLQuery(
				"SELECT LAST_INSERT_ID()").uniqueResult()).longValue();
		anInt = new BigDecimal(lastId).intValueExact();

		//Asigna el IdEmpresa
		e.setIdEmpresa(anInt);
		propietarioid.setIdEmpresa(anInt);*/
		
		
		
		
		
		//:VER
		//Registra la lista de telefonos
     /*   for(Telefonopersona i: listTel){
            i.setEmpresa(p);
            session.save(p);
        }
		*/
		//Asigna el propietarioId
		
	/*	interesado.setIdInteresado(idInteresado);
		interesado.setId(propietarioid);*/
		
		
		//Registra el propietario
		session.save(interesado);
		
		transaction.commit();
	
		                
        } catch (Exception e1) {
            //Error
            if (transaction != null) {
                transaction.rollback();
                throw e1;
              }
        } finally { 
            session.close();
     }
	}
	}
